package cn.gx.kevin.dao;

import cn.gx.kevin.common.utils.DynamicSqlAnalyseRet;
import cn.gx.kevin.domain.*;
import org.apache.ibatis.session.SqlSession;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/***
 *@description : 数据采集接口
 *@author : kevin.huang
 *@date : 2019/10/26 15:47
 @modified by
 ***/
public interface IDynamicDao {

    /**
     * 获取sqlSession的公开接口
     * @param key
     * @return
     */
    SqlSession getSession(String key);

    /**
     * 切换到指定数据库
     ***/
    void setDbKey(String key);

    /**
     * 恢复到默认数据库
     ***/
    void clearDbKey();

    /**
     * 插入数据
     * @param params 数据插入参数
     * @return 影响记录条数
     */
    int insert(DynamicInsertParam params) throws Exception;

    /**
     * count计算
     * @param params DynamicCountParam
     * @return 记录数
     */
    int count(DynamicCountParam params) throws Exception;

    /**
     * 更新数据
     * @param params 数据更新参数
     * @return 影响记录条数
     */
    int update(DynamicUpdateParam params) throws Exception;

    /**
     * 高性能批量插入数据
     * @param params 批量插入数据参数
     * @return 影响记录条数
     */
    int insertBatch(DynamicBatchInsertParam params) throws Exception;


    /**
     * 根据条件查询数据
     * @param params 查询条件
     * @return 数据列表
     */
    List<LinkedHashMap<String,Object>> select(DynamicSelectParam params) throws Exception;


    /**
     *  自行自定义的sql分页查询
     * @param sql
     * @param page
     * @param pageSize
     * @param params
     * @return
     * @throws Exception
     */
    DynamicPagingResult selectOnSql(String sql, int page, int pageSize, Map<String, Object> params) throws Exception;

    /**
     * 自定义非分页sql查询
     * @param sql
     * @param params
     * @return
     * @throws Exception
     */
    List<LinkedHashMap<String,Object>> selectOnSqlNotPagin(String sql, Map<String, Object> params) throws Exception;

    /**
     * 动态分页查询

     * @return DynamicPagingResult
     * @throws Exception
     */
    DynamicPagingResult selectPagin(int page, int pageSize, DynamicSelectParam params) throws Exception;


    /**
     * 删除数据
     * @param params 删除参数
     * @return 影响记录条数
     */
    int delete(DynamicDeleteParam params) throws Exception;

    /**
     * count、sum、avg 计算数据
     * @param params sum、avg 计算参数
     * @return  Map<String,Integer>
     */
    List<LinkedHashMap<String,Object>> computedParam(DynamicComputedParam params) throws Exception;

    /***
     * count、sum、avg运算结果分页查询
     * @param page 当前页
     * @param pageSize 页大小
     * @param params 动态查询参数
     * ***/
    DynamicPagingResult selectPaginComputed(int page, int pageSize, DynamicComputedParam params) throws Exception;

    /**
     * 删除数据库表 tableName
     * @param  tableName
     * @throws Exception
     */
    SqlSession dropDatabaseTable(String tableName, SqlSession session) throws Exception;


    /**
     * 删除数据库表 tableName
     * @param  tableName
     * @throws Exception
     */
    SqlSession createTempTable(String tableName, SqlSession session, Map<String, Object> params) throws Exception;

    /**
     *创建临时表
     * @param createSql 创建语句
     * @throws Exception
     */
    SqlSession  createTempTable(String createSql, SqlSession session) throws Exception;

    /**
     * 执行sql 的 insert into select 语句
     * @param sql
     * @param session
     * @param params
     * @return
     * @throws Exception
     */
    SqlSession executeInsertIntoSql(String sql, Map<String, Object> params, SqlSession session) throws Exception;

    /**
     * 根据sql,和参数map分析出符合mybatis的sql和参数map
     * @param sql
     * @param params
     * @param paramPrex
     * @param paramStyle # / $
     * @return
     * @throws Exception
     */
    DynamicSqlAnalyseRet buildSqlAndParams(String sql, Map<String, Object> params, String paramPrex, String paramStyle)  throws Exception;
}
